from typing import Dict, Any, Optional
from config import MODEL_TYPE, OLLAMA_CONFIG, VLLM_CONFIG, OPENAI_CONFIG, MEDAI_CONFIG
from llm.Ollama.ollama_client import OllamaClient
from llm.vLLM.vllm_client import VLLMClient
from llm.OpenAI.openai_client import OpenAIClient
from llm.MedAI.medai_client import MedAIClient
from llm.model_interface import ModelInterface

class ModelFactory:
    """模型工厂类，用于根据配置自动创建模型实例"""
    
    _model_mapping = {
        'ollama': OllamaClient,
        'vllm': VLLMClient,
        'openai': OpenAIClient,
        'medai': MedAIClient
    }
    
    _config_mapping = {
        'ollama': OLLAMA_CONFIG,
        'vllm': VLLM_CONFIG,
        'openai': OPENAI_CONFIG,
        'medai': MEDAI_CONFIG
    }
    
    @classmethod
    def create_model(cls, 
                    model_type: Optional[str] = None,
                    config: Optional[Dict[str, Any]] = None) -> ModelInterface:
        """
        创建模型实例
        
        Args:
            model_type: 模型类型，可选值: 'ollama', 'vllm', 'openai'
            config: 模型配置字典，如果为None则使用默认配置
            api_key: API密钥，如果提供则覆盖配置文件中的值
            
        Returns:
            ModelInterface: 模型接口实例
            
        Raises:
            ValueError: 当模型类型不支持或配置无效时
        """
        # 使用传入的模型类型或配置文件中的默认类型
        model_type = model_type or MODEL_TYPE
        
        # 检查模型类型是否支持
        if model_type not in cls._model_mapping:
            raise ValueError(f"不支持的模型类型: {model_type}")
        
        # 获取模型类和默认配置
        model_class = cls._model_mapping[model_type]
        default_config = cls._config_mapping[model_type]
        
        # 合并配置
        final_config = default_config.copy()
        if config:
            final_config.update(config)
            
        # 创建模型实例
        try:
            return model_class(config=final_config)
        except Exception as e:
            raise ValueError(f"创建模型实例失败: {str(e)}")
    
    @classmethod
    def get_supported_models(cls) -> list:
        """
        获取支持的模型类型列表
        
        Returns:
            list: 支持的模型类型列表
        """
        return list(cls._model_mapping.keys())
    
    @classmethod
    def get_default_config(cls, model_type: str) -> Dict[str, Any]:
        """
        获取指定模型类型的默认配置
        
        Args:
            model_type: 模型类型
            
        Returns:
            Dict[str, Any]: 默认配置字典
            
        Raises:
            ValueError: 当模型类型不支持时
        """
        if model_type not in cls._config_mapping:
            raise ValueError(f"不支持的模型类型: {model_type}")
        return cls._config_mapping[model_type].copy()